1 Evolution in Switzerland and Western Europe

The figures do not represent the same thing in each country, depending on the extent of the screening tests carried out. Regardless of this problem, the weekly and daily trend curves allow you to get an idea of the foreseeable evolution for the next days (assuming that the screening strategy does not change over time). Respectively, it provides an indication of a possible inflection of the progression of the epidemic in the near future.

1.1 Switzerland

1.2 Italy

1.3 France

1.4 Germany

1.5 Austria

1.6 Spain

1.7 Great Britain

1.8 Denmark

1.9 Norway

1.10 Sweden

1.11 Iceland

2 What Happened in Hubei Province (China)

3 What Is Happening in USA

4 Comparison of Number of Confirmed Cases in Western Europe

5 Comparison of Number of Deaths in Western Europe

6 Comparison of Number of Recovered Cases in Western Europe

WARNING: The figures seem to be wrong on March 23, 2020.

7 Comparison of Number of Active Cases in Western Europe

WARNING: The figures seem to be wrong on March 23, 2020.

8 About

All the graphs above are generated from the data provided by Johns Hopkins CSSE (provided to the public strictly for educational and academic research purposes).

The source code for generating the graphs is available under MIT License at https://github.com/philippe-docourt/COVID-19/blob/master/covid_19_western_europe.Rmd.

The data are provided as 2019 Novel Coronavirus COVID-19 (2019-nCoV) Data Repository by Johns Hopkins CSSE (see https://github.com/CSSEGISandData/COVID-19).

See https://github.com/philippe-docourt/COVID-19/blob/master/README.md for more details.

8.2 Terms of Use

LS0tCnRpdGxlOiAiQ09WSUQtMTkgaW4gU3dpdHplcmxhbmQgYW5kIFdlc3Rlcm4gRXVyb3BlIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICBodG1sX25vdGVib29rOiAKICAgIGZpZ19oZWlnaHQ6IDUKICAgIGZpZ193aWR0aDogNwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDogZGVmYXVsdApkYXRlOiAiTGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWSAtICVIOiVNJylgIgphdXRob3I6ICJQaGlsaXBwZSBEb2NvdXJ0IgotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRhdGEudGFibGUpCgpnZXRfdGltZXNlcmllc19hc192ZWN0b3IgPC0gZnVuY3Rpb24oZGYpIHsKICB0bXAgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSAtYygxOjQpKQogIHRtcCA8LSBzYXBwbHkoYXMudmVjdG9yKHRyYW5zcG9zZSh0bXApKSwgYXMuaW50ZWdlcikKICByZXR1cm4odG1wKQp9CgpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5IDwtIGZ1bmN0aW9uKGNvdW50cnkuY29uZmlybWVkLCBjb3VudHJ5LmRlYXRocywgY291bnRyeS5yZWNvdmVyZWQsIGNvdW50cnkubmFtZSwgcHVibGljLnNwYWNlcy5jbG9zZWQuYXQ9TkEsIGNvbmZpbmVtZW50LmF0PU5BLCB0cmVuZC5hbmdsZT0yMCkgewogICAgZGF5LmNvdW50IDwtIG5yb3coY291bnRyeS5jb25maXJtZWQpCiAgeWxpbSA8LSBjKDAsIDEuMyAqIG1heChjb3VudHJ5LmNvbmZpcm1lZCwgbmEucm0gPSBUUlVFKSkKICBkYXkuc3RhcnQgPC0gbWluKGMoNDUsIHB1YmxpYy5zcGFjZXMuY2xvc2VkLmF0LCBjb25maW5lbWVudC5hdCksIG5hLnJtID0gVFJVRSkKICBwbG90KGNvdW50cnkuY29uZmlybWVkLCBtYWluPSBwYXN0ZSgiQ2FzZXMgaW4iLCBjb3VudHJ5Lm5hbWUpLCB0eXBlID0gIm8iLCB4bGFiID0gIkRheXMgU2luY2UgSmFudWFyeSAyMSwgMjAyMCIsIHlsYWIgPSAiTnVtYmVyIG9mIENhc2VzIiwgY29sID0gInJlZCIsIHhsaW0gPSAgYyhkYXkuc3RhcnQsIGRheS5jb3VudCArIDcpLCB5bGltID0geWxpbSkKICBsaW5lcyhzZXEoMSwgbGVuZ3RoKGNvdW50cnkuZGVhdGhzKSksIGNvdW50cnkuZGVhdGhzLCB0eXBlID0gImwiLCBjb2wgPSAiYmxhY2siLCBsdHkgPSAxLCBsdyA9IDEpCiAgbGluZXMoc2VxKDEsIGxlbmd0aChjb3VudHJ5LnJlY292ZXJlZCkpLCBjb3VudHJ5LnJlY292ZXJlZCwgdHlwZSA9ICJsIiwgY29sID0gImdyZWVuIiwgbHR5ID0gMSwgbHcgPSAxKQogIGdyaWQoKQoKICAjIFRyZW5kIGJhc2VkIG9uIGxhc3QgdHdvIG9ic2VydmF0aW9ucyAobGFzdCBkYXkpLgogIGxhc3QuY29uZmlybWVkIDwtIHRhaWwoY291bnRyeS5jb25maXJtZWQsIG4gPSAyKQogIGR5IDwtbGFzdC5jb25maXJtZWRbMl0gLSBsYXN0LmNvbmZpcm1lZFsxXQogIHNsb3BlIDwtIGR5CiAgdSA8LSBjKDEsIGR5KQogIGEgPC0gbGFzdC5jb25maXJtZWRbMV0gLSAoZGF5LmNvdW50IC0gMSkgKiBzbG9wZQogIGFibGluZShhID0gYSwgYiA9IHNsb3BlLCBjb2wgPSAidmlvbGV0IiwgbHcgPSAxLjUsIGx0eSA9IDQpCiAgbGFzdC5wcm9ncmVzc2lvbi5wY3QgPC0gcm91bmQoKDEwMCAqIGR5KSAvIGxhc3QuY29uZmlybWVkWzFdKQogIHRleHQoeCA9IGRheS5jb3VudCAtIDQsIHkgPSAwLjUgKiB5bGltWzJdLCBwYXN0ZShkeSwgImNhc2VzL2RheVxuRXh0cmFwb2xhdGlvbjoiLCBkeSAqIDcsICJjYXNlL3cuXG4iLCBsYXN0LnByb2dyZXNzaW9uLnBjdCwgIiUgcHJvZ3Jlc3MgbGFzdCBkYXkiKSwgc3J0ID0gdHJlbmQuYW5nbGUsIGNvbCA9ICJ2aW9sZXQiKQogIAogICMgVHJlbmQgYmFzZWQgb24gbGFzdCA4IG9ic2VydmF0aW9ucyAoNyBpbnRlcnZhbHMsIG9uZSB3ZWVrKQogIGxhc3QuY29uZmlybWVkIDwtIHRhaWwoY291bnRyeS5jb25maXJtZWQsIG4gPSA4KQogIGR5IDwtbGFzdC5jb25maXJtZWRbOF0gLSBsYXN0LmNvbmZpcm1lZFsxXQogIHNsb3BlIDwtIGR5IC8gNwogIHUgPC0gYyg3LCBkeSkKICBhIDwtIGxhc3QuY29uZmlybWVkWzFdIC0gKGRheS5jb3VudCAtIDcpICogc2xvcGUKICBhYmxpbmUoYSA9IGEsIGIgPSBzbG9wZSwgY29sID0gImJsYWNrIiwgbHcgPSAxLjUsIGx0eSA9IDQpCiAgbGFzdC5wcm9ncmVzc2lvbi5wY3QgPC0gcm91bmQoKDEwMCAqIGR5KSAvIGxhc3QuY29uZmlybWVkWzFdKQogIHRleHQoeCA9IGRheS5jb3VudCAtIDgsIHkgPSAoMC44OCAtICh0cmVuZC5hbmdsZS8zMDAwKSkgKiB5bGltWzJdLCBwYXN0ZShkeSwgImNhc2VzL3cuXG5Bdmc6IiwgZHkgJS8lIDcsICJjYXNlL2RheVxuIiwgbGFzdC5wcm9ncmVzc2lvbi5wY3QsICIlIHByb2dyZXNzIGxhc3Qgd2VlayIpLCBzcnQgPSB0cmVuZC5hbmdsZSwgY29sID0gImJsYWNrIikKICAKICAjIFNob3cgc3BlY2lhbCBtZWFzdXJlcyBhZ2FpbnN0IHByb3BhZ2F0aW9uLgogIHlwb3MgPSBtYXgoY291bnRyeS5jb25maXJtZWQsIG5hLnJtID0gVFJVRSkgJS8lIDMKICBpZiAoIWlzLm5hKHB1YmxpYy5zcGFjZXMuY2xvc2VkLmF0KSkgewogICAgYWJsaW5lKHYgPSBwdWJsaWMuc3BhY2VzLmNsb3NlZC5hdCwgY29sID0gImJsdWUiLCBsdyA9IDEsIGx0eSA9IDUpCiAgICB0ZXh0KHggPSBwdWJsaWMuc3BhY2VzLmNsb3NlZC5hdCAtIDEsIHkgPSB5cG9zLCAiQWxsIHB1YmxpYyBzcGFjZXMgYXJlIGNsb3NlZCIsIGNvbCA9ICJibHVlIiwgc3J0ID0gOTApCiAgfQogIGlmICghaXMubmEoY29uZmluZW1lbnQuYXQpKSB7CiAgICBhYmxpbmUodiA9IGNvbmZpbmVtZW50LmF0LCBjb2wgPSAicmVkIiwgbHcgPSAxLCBsdHkgPSA1KQogICAgdGV4dCh4ID0gY29uZmluZW1lbnQuYXQgLSAxLCB5ID0geXBvcywgIlBvcHVsYXRpb24gaXMgY29uZmluZWQiLCBjb2wgPSAicmVkIiwgc3J0ID0gOTApCiAgfQogIAogIGxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIkNvbmZpcm1lZCIsICJEZWF0aHMiLCAiUmVjb3ZlcmVkIiwgIkNvbmZpcm1lZCB0cmVuZCBiYXNlZCBvbiBsYXN0IGRheSIsICJDb25maXJtZWQgdHJlbmQgYmFzZWQgb24gbGFzdCB3ZWVrIiksIGNvbCA9IGMoInJlZCIsICJibGFjayIsICJncmVlbiIsICJ2aW9sZXQiLCAiYmxhY2siKSwgbHR5ID0gYyhyZXAoMSwgMyksIDIsIDMpLCBsdyA9IGMocmVwKDEsIDMpLCAxLjUsIDEuNSkpCiAgCiAgZGlmZnMgPC0gZGlmZihjb3VudHJ5LmNvbmZpcm1lZCkKICBwbG90KHNlcSgyLCBkYXkuY291bnQpLCBkaWZmcywgdHlwZSA9ICJoIiwgY29sID0gImJsdWUiLCB4bGltID0gIGMoZGF5LnN0YXJ0ICsgMSwgZGF5LmNvdW50KSwgbWFpbiA9IHBhc3RlKCJOZXcgQ29uZmlybWVkIENhc2VzIHBlciBEYXkiLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IENhc2VzIHBlciBEYXkiLCBsd2QgPSA1KQogIGdyaWQoKQogIAogIGRpZmZzIDwtIGRpZmYoY291bnRyeS5kZWF0aHMpCiAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJibGFjayIsIHhsaW0gPSAgYyhkYXkuc3RhcnQgKyAxLCBkYXkuY291bnQpLCBtYWluID0gcGFzdGUoIk5ldyBEZWF0aHMgcGVyIERheSIsIGNvdW50cnkubmFtZSwgc2VwID0gIiBpbiAiKSwgeGxhYiA9ICJEYXlzIFNpbmNlIEphbnVhcnkgMjEsIDIwMjAiLCB5bGFiID0gIk51bWJlciBvZiBOZXcgRGVhdGhzIHBlciBEYXkiLCBsd2QgPSA1KQogIGdyaWQoKQogIAogIGlmICghaXMubmEoY291bnRyeS5yZWNvdmVyZWQpKSB7CiAgICBkaWZmcyA8LSBkaWZmKGNvdW50cnkucmVjb3ZlcmVkKQogICAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJncmVlbiIsIHhsaW0gPSAgYyhkYXkuc3RhcnQgKyAxLCBkYXkuY291bnQpLCAgbWFpbiA9IHBhc3RlKCJOZXcgUmVjb3ZlcmVkIENhc2VzIHBlciBEYXkgaW4iLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IFJlY292ZXJlZCBDYXNlcyBwZXIgRGF5IiwgbHdkID0gNSkKICAgIGdyaWQoKQogICAgCiAgICBkaWZmcyA8LSBkaWZmKGNvdW50cnkuY29uZmlybWVkIC0gKGNvdW50cnkuZGVhdGhzICsgY291bnRyeS5yZWNvdmVyZWQpKQogICAgcGxvdChzZXEoMiwgZGF5LmNvdW50KSwgZGlmZnMsIHR5cGUgPSAiaCIsIGNvbCA9ICJyZWQiLCB4bGltID0gIGMoZGF5LnN0YXJ0ICsgMSwgZGF5LmNvdW50KSwgbWFpbiA9IHBhc3RlKCJOZXcgQWN0aXZlIENhc2VzIHBlciBEYXkiLCBjb3VudHJ5Lm5hbWUsIHNlcCA9ICIgaW4gIiksIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IEFjdGl2ZSBDYXNlcyBwZXIgRGF5IiwgbHdkPTUpCiAgICBncmlkKCkKICB9Cn0KCmNvdmlkIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikKY292aWQuZGVhdGhzIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IikKY292aWQucmVjb3ZlcmVkIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X3JlY292ZXJlZF9nbG9iYWwuY3N2IikKCmNvdW50cnkubmFtZXMgPC0gYygiU3dpdHplcmxhbmQiLCAiSXRhbHkiLCAiRnJhbmNlIiwgIkdlcm1hbnkiLCAiQXVzdHJpYSIgLCAiU3BhaW4iLCAiR3JlYXQgQnJpdGFpbiIsICJEZW5tYXJrIiwgIk5vcndheSIsICJTd2VkZW4iLCAiSWNlbGFuZCIpCmNvdW50cnkuY291bnQgPC0gbGVuZ3RoKGNvdW50cnkubmFtZXMpCmNvbCA8LSByYWluYm93KGNvdW50cnkuY291bnQpCmx0eSA8LSBzZXEoMSwgY291bnRyeS5jb3VudCkKcGNoIDwtIHNlcSgxMCwgMTAgKyBjb3VudHJ5LmNvdW50KQoKc3dpdHplcmxhbmQuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQpzd2l0emVybGFuZC5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQpzd2l0emVybGFuZC5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJTd2l0emVybGFuZCIpKQoKaXRhbHkuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQppdGFseS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQppdGFseS5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJJdGFseSIpKQoKZnJhbmNlLmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiRnJhbmNlIiAmIFByb3ZpbmNlLlN0YXRlID09ICIiKSkKZnJhbmNlLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIkZyYW5jZSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiIikpCmZyYW5jZS5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJGcmFuY2UiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKZ2VybWFueS5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkdlcm1hbnkiKSkKZ2VybWFueS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJHZXJtYW55IikpCmdlcm1hbnkucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiR2VybWFueSIpKQoKYXVzdHJpYS5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkF1c3RyaWEiKSkKYXVzdHJpYS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJBdXN0cmlhIikpCmF1c3RyaWEucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiQXVzdHJpYSIpKQoKc3BhaW4uY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQpzcGFpbi5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQpzcGFpbi5yZWNvdmVyZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5yZWNvdmVyZWQsIENvdW50cnkuUmVnaW9uID09ICJTcGFpbiIpKQoKdWsuY29uZmlybWVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQsIENvdW50cnkuUmVnaW9uID09ICJVbml0ZWQgS2luZ2RvbSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiIikpCnVrLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIlVuaXRlZCBLaW5nZG9tIiAmIFByb3ZpbmNlLlN0YXRlID09ICIiKSkKdWsucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiVW5pdGVkIEtpbmdkb20iICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKZGVubWFyay5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQpkZW5tYXJrLmRlYXRocyA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLmRlYXRocywgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQpkZW5tYXJrLnJlY292ZXJlZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLnJlY292ZXJlZCwgQ291bnRyeS5SZWdpb24gPT0gIkRlbm1hcmsiICYgUHJvdmluY2UuU3RhdGUgPT0gIiIpKQoKbm9yd2F5LmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQpub3J3YXkuZGVhdGhzIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQuZGVhdGhzLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQpub3J3YXkucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQoKc3dlZGVuLmNvbmZpcm1lZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiU3dlZGVuIikpCnN3ZWRlbi5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJTd2VkZW4iKSkKc3dlZGVuLnJlY292ZXJlZCA8LSBnZXRfdGltZXNlcmllc19hc192ZWN0b3Ioc3Vic2V0KGNvdmlkLnJlY292ZXJlZCwgQ291bnRyeS5SZWdpb24gPT0gIlN3ZWRlbiIpKQoKaWNlbGFuZC5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkljZWxhbmQiKSkKaWNlbGFuZC5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJJY2VsYW5kIikpCmljZWxhbmQucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiSWNlbGFuZCIpKQoKY291bnRyaWVzLmNvbmZpcm1lZCA8LSBsaXN0KHN3aXR6ZXJsYW5kLmNvbmZpcm1lZCwgaXRhbHkuY29uZmlybWVkLCBmcmFuY2UuY29uZmlybWVkLCBnZXJtYW55LmNvbmZpcm1lZCwgYXVzdHJpYS5jb25maXJtZWQsIHNwYWluLmNvbmZpcm1lZCwgdWsuY29uZmlybWVkLCBkZW5tYXJrLmNvbmZpcm1lZCwgbm9yd2F5LmNvbmZpcm1lZCwgc3dlZGVuLmNvbmZpcm1lZCwgaWNlbGFuZC5jb25maXJtZWQpCmNvdW50cmllcy5kZWF0aHMgPC0gbGlzdChzd2l0emVybGFuZC5kZWF0aHMsIGl0YWx5LmRlYXRocywgZnJhbmNlLmRlYXRocywgZ2VybWFueS5kZWF0aHMsIGF1c3RyaWEuZGVhdGhzLCBzcGFpbi5kZWF0aHMsIHVrLmRlYXRocywgZGVubWFyay5kZWF0aHMsIG5vcndheS5kZWF0aHMsIHN3ZWRlbi5kZWF0aHMsIGljZWxhbmQuZGVhdGhzKQpjb3VudHJpZXMucmVjb3ZlcmVkIDwtIGxpc3Qoc3dpdHplcmxhbmQucmVjb3ZlcmVkLCBpdGFseS5yZWNvdmVyZWQsIGZyYW5jZS5yZWNvdmVyZWQsIGdlcm1hbnkucmVjb3ZlcmVkLCBhdXN0cmlhLnJlY292ZXJlZCwgc3BhaW4ucmVjb3ZlcmVkLCB1ay5yZWNvdmVyZWQsIGRlbm1hcmsucmVjb3ZlcmVkLCBub3J3YXkucmVjb3ZlcmVkLCBzd2VkZW4uY29uZmlybWVkLCBpY2VsYW5kLnJlY292ZXJlZCkKCgpkYXkuY291bnQgPC0gTlJPVyhzd2l0emVybGFuZC5jb25maXJtZWQpCmBgYAoKIyBFdm9sdXRpb24gaW4gU3dpdHplcmxhbmQgYW5kIFdlc3Rlcm4gRXVyb3BlCgpUaGUgZmlndXJlcyBkbyBub3QgcmVwcmVzZW50IHRoZSBzYW1lIHRoaW5nIGluIGVhY2ggY291bnRyeSwgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnQgb2YgdGhlIHNjcmVlbmluZyB0ZXN0cyBjYXJyaWVkIG91dC4gUmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0sIHRoZSB3ZWVrbHkgYW5kIGRhaWx5IHRyZW5kIGN1cnZlcyBhbGxvdyB5b3UgdG8gZ2V0IGFuIGlkZWEgb2YgdGhlIGZvcmVzZWVhYmxlIGV2b2x1dGlvbiBmb3IgdGhlIG5leHQgZGF5cyAoYXNzdW1pbmcgdGhhdCB0aGUgc2NyZWVuaW5nIHN0cmF0ZWd5IGRvZXMgbm90IGNoYW5nZSBvdmVyIHRpbWUpLiBSZXNwZWN0aXZlbHksIGl0IHByb3ZpZGVzIGFuIGluZGljYXRpb24gb2YgYSBwb3NzaWJsZSBpbmZsZWN0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgZXBpZGVtaWMgaW4gdGhlIG5lYXIgZnV0dXJlLgoKIyMgU3dpdHplcmxhbmQKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoc3dpdHplcmxhbmQuY29uZmlybWVkLCBzd2l0emVybGFuZC5kZWF0aHMsIHN3aXR6ZXJsYW5kLnJlY292ZXJlZCwgIlN3aXR6ZXJsYW5kIiwgNTUsIE5BLCB0cmVuZC5hbmdsZSA9IDIpCmBgYAoKIyMgSXRhbHkKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoaXRhbHkuY29uZmlybWVkLCBpdGFseS5kZWF0aHMsIGl0YWx5LnJlY292ZXJlZCwgIkl0YWx5IiwgTkEsIHRyZW5kLmFuZ2xlID0gNSkKYGBgCgojIyBGcmFuY2UKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoZnJhbmNlLmNvbmZpcm1lZCwgZ2VybWFueS5kZWF0aHMsIGZyYW5jZS5yZWNvdmVyZWQsICJGcmFuY2UiLCA1MywgNTYsIHRyZW5kLmFuZ2xlID0gMCkKYGBgCgojIyBHZXJtYW55CmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KGdlcm1hbnkuY29uZmlybWVkLCBzd2l0emVybGFuZC5kZWF0aHMsIGdlcm1hbnkucmVjb3ZlcmVkLCAiR2VybWFueSIsIDQ4LCBOQSwgdHJlbmQuYW5nbGUgPSA2KQpgYGAKCiMjIEF1c3RyaWEKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoYXVzdHJpYS5jb25maXJtZWQsIGF1c3RyaWEuZGVhdGhzLCBhdXN0cmlhLnJlY292ZXJlZCwgIkF1c3RyaWEiLCA1MiwgTkEsIHRyZW5kLmFuZ2xlID0gMykKYGBgCgojIyBTcGFpbgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF90aW1lX3Nlcmllc19mb3JfY291bnRyeShzcGFpbi5jb25maXJtZWQsIHNwYWluLmRlYXRocywgc3BhaW4ucmVjb3ZlcmVkLCAiU3BhaW4iLCBOQSwgNTMsIHRyZW5kLmFuZ2xlID0gNSkKYGBgCgojIyBHcmVhdCBCcml0YWluCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KHVrLmNvbmZpcm1lZCwgdWsuZGVhdGhzLCB1ay5yZWNvdmVyZWQsICJHcmVhdCBCcml0YWluIiwgTkEsIE5BLCB0cmVuZC5hbmdsZSA9IDIyKQpgYGAKCiMjIERlbm1hcmsKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoZGVubWFyay5jb25maXJtZWQsIGRlbm1hcmsuZGVhdGhzLCBkZW5tYXJrLnJlY292ZXJlZCwgIkRlbm1hcmsiLCBOQSwgTkEsIHRyZW5kLmFuZ2xlID0gMTApCmBgYAoKIyMgTm9yd2F5CmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KG5vcndheS5jb25maXJtZWQsIG5vcndheS5kZWF0aHMsIG5vcndheS5yZWNvdmVyZWQsICJOb3J3YXkiLCBOQSwgTkEsIHRyZW5kLmFuZ2xlID0gMCkKYGBgCgojIyBTd2VkZW4KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfdGltZV9zZXJpZXNfZm9yX2NvdW50cnkoc3dlZGVuLmNvbmZpcm1lZCwgc3dlZGVuLmRlYXRocywgc3dlZGVuLnJlY292ZXJlZCwgIlN3ZWRlbiIsIE5BLCBOQSwgdHJlbmQuYW5nbGUgPSAzMCkKYGBgCgojIyBJY2VsYW5kCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KGljZWxhbmQuY29uZmlybWVkLCBpY2VsYW5kLmRlYXRocywgaWNlbGFuZC5yZWNvdmVyZWQsICJJY2VsYW5kIiwgTkEsIE5BLCB0cmVuZC5hbmdsZSA9IDApCmBgYAoKIyBXaGF0IEhhcHBlbmVkIGluIEh1YmVpIFByb3ZpbmNlIChDaGluYSkKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpodWJlaS5jb25maXJtZWQgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZCwgQ291bnRyeS5SZWdpb24gPT0gIkNoaW5hIiAmIFByb3ZpbmNlLlN0YXRlID09ICJIdWJlaSIpKQpodWJlaS5kZWF0aHMgPC0gZ2V0X3RpbWVzZXJpZXNfYXNfdmVjdG9yKHN1YnNldChjb3ZpZC5kZWF0aHMsIENvdW50cnkuUmVnaW9uID09ICJDaGluYSIgJiBQcm92aW5jZS5TdGF0ZSA9PSAiSHViZWkiKSkKaHViZWkucmVjb3ZlcmVkIDwtIGdldF90aW1lc2VyaWVzX2FzX3ZlY3RvcihzdWJzZXQoY292aWQucmVjb3ZlcmVkLCBDb3VudHJ5LlJlZ2lvbiA9PSAiQ2hpbmEiICYgUHJvdmluY2UuU3RhdGUgPT0gIkh1YmVpIikpCgpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KGh1YmVpLmNvbmZpcm1lZCwgaHViZWkuZGVhdGhzLCBodWJlaS5yZWNvdmVyZWQsICJIdWJlaSBQcm92aW5jZSwgQ2hpbmEiLCBOQSwgMiwgdHJlbmQuYW5nbGUgPSAwKQpgYGAKCiMgV2hhdCBJcyBIYXBwZW5pbmcgaW4gVVNBCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2V0X3N1bV9vZl90aW1lc2VyaWVzX2FzX3ZlY3Rvcl9mb3JfdXNhIDwtIGZ1bmN0aW9uKGRmLCBleGx1ZGUpIHsKICB0bXAgPC0gY29sU3VtcyhzdWJzZXQoZGYsIHNlbGVjdCA9IC1leGx1ZGUpKQogIHRtcCA8LSBzYXBwbHkoYXMudmVjdG9yKHRyYW5zcG9zZShhcy5saXN0KHRtcCkpKSwgYXMuaW50ZWdlcikKICByZXR1cm4odG1wKQp9Cgpjb3ZpZC51cyA8LSByZWFkLmNzdigiY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfY292aWQxOV9jb25maXJtZWRfVVMuY3N2IikKY292aWQudXMuZGVhdGhzIDwtIHJlYWQuY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19VUy5jc3YiKQoKdXNhLmNvbmZpcm1lZCA8LSBzdWJzZXQoY292aWQudXMsIGlzbzMgPT0gIlVTQSIpCnVzYS5kZWF0aHMgPC0gc3Vic2V0KGNvdmlkLnVzLmRlYXRocywgaXNvMyA9PSAiVVNBIikKCnVzYS5jb25maXJtZWQgPC0gZ2V0X3N1bV9vZl90aW1lc2VyaWVzX2FzX3ZlY3Rvcl9mb3JfdXNhKHVzYS5jb25maXJtZWQsIGMoMToxMSkpCnVzYS5kZWF0aHMgPC0gZ2V0X3N1bV9vZl90aW1lc2VyaWVzX2FzX3ZlY3Rvcl9mb3JfdXNhKHVzYS5kZWF0aHMsIGMoMToxMikpCgpwbG90X3RpbWVfc2VyaWVzX2Zvcl9jb3VudHJ5KHVzYS5jb25maXJtZWQsIHVzYS5kZWF0aHMsIE5BLCAiVVNBIiwgTkEsIE5BLCB0cmVuZC5hbmdsZT0yNSkKYGBgCgojIENvbXBhcmlzb24gb2YgTnVtYmVyIG9mIENvbmZpcm1lZCBDYXNlcyBpbiBXZXN0ZXJuIEV1cm9wZQoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnhyYW5nZSA8LSBjKDM1LCBkYXkuY291bnQpCm1heC55IDwtIDAKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIG1heC55IDwtIG1heChjKG1heC55LCBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0pLCBuYS5ybSA9IFRSVUUpCn0KeXJhbmdlIDwtIGMoMCwgbWF4LnkpCnBsb3QoeHJhbmdlLCB5cmFuZ2UsIG1haW49ICJDb25maXJtZWQgQ2FzZXMiLCB0eXBlID0gIm4iLCB4bGFiID0gIkRheXMgU2luY2UgMjAyMC0wMS0yMSIsIHlsYWIgPSAiTnVtYmVyIG9mIENhc2VzIikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGxpbmVzKHNlcSgxLCBkYXkuY291bnQpLCBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0sIHR5cGUgPSAiYiIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gbHR5W2ldLCBwY2ggPSBwY2hbaV0sIGx3ID0gMSkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSBsdHksIHBjaCA9IHBjaCwgdGl0bGUgPSAiQ291bnRyeSIpCgptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgZGlmZih0YWlsKGNvdW50cmllcy5jb25maXJtZWRbW2ldXSkpKSwgbmEucm0gPSBUUlVFKQp9CnhyYW5nZSA8LSBjKGRheS5jb3VudC0xMCwgZGF5LmNvdW50KQp5cmFuZ2UgPC0gYygwLCBtYXgueSAqIDIpCnBsb3QoeHJhbmdlLCB5cmFuZ2UsIG1haW49ICJOZXcgQ29uZmlybWVkIENhc2VzIHBlciBEYXkgKGxhc3QgMTAgZGF5cykiLCB0eXBlID0gIm4iLCB4bGFiID0gIkRheXMgU2luY2UgMjAyMC0wMS0yMSIsIHlsYWIgPSAiTnVtYmVyIG9mIE5ldyBDYXNlcyBwZXIgRGF5IikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGxpbmVzKHNlcSgyLCBkYXkuY291bnQpIC0gMC40NSArIDAuMDggKiBpLCBkaWZmKGNvdW50cmllcy5jb25maXJtZWRbW2ldXSksIHR5cGUgPSAiaCIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gMSwgbHcgPSA0KQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IDEsIGx3ID0gNCwgdGl0bGUgPSAiQ291bnRyeSIsIG5jb2wgPSA0LCBjZXggPSAwLjkpCmBgYAoKIyBDb21wYXJpc29uIG9mIE51bWJlciBvZiBEZWF0aHMgaW4gV2VzdGVybiBFdXJvcGUKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp4cmFuZ2UgPC0gYyg0MCwgZGF5LmNvdW50KQptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICBtYXgueSA8LSBtYXgoYyhtYXgueSwgY291bnRyaWVzLmRlYXRoc1tbaV1dKSwgbmEucm0gPSBUUlVFKQp9CnlyYW5nZSA8LSBjKDAsIG1heC55KQpwbG90KHhyYW5nZSwgeXJhbmdlLCBtYWluPSAiRGVhdGhzIiwgdHlwZSA9ICJuIiwgeGxhYiA9ICJEYXlzIFNpbmNlIEphbnVhcnkgMjEsIDIwMjAiLCB5bGFiID0gIk51bWJlciBvZiBEZWF0aHMiKQpmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgbGluZXMoc2VxKDEsIGRheS5jb3VudCksIGNvdW50cmllcy5kZWF0aHNbW2ldXSwgdHlwZSA9ICJiIiwgY29sID0gY29sW2ldLCBsdHkgPSBsdHlbaV0sIHBjaCA9IHBjaFtpXSwgbHcgPSAxKQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IGx0eSwgcGNoID0gcGNoLCB0aXRsZSA9ICJDb3VudHJ5IikKCm1heC55IDwtIDAKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIG1heC55IDwtIG1heChjKG1heC55LCBkaWZmKHRhaWwoY291bnRyaWVzLmRlYXRoc1tbaV1dKSkpLCBuYS5ybSA9IFRSVUUpCn0KeHJhbmdlIDwtIGMoZGF5LmNvdW50LTEwLCBkYXkuY291bnQpCnlyYW5nZSA8LSBjKDAsIG1heC55ICogMikKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIk5ldyBEZWF0aHMgcGVyIERheSAobGFzdCAxMCBkYXlzKSIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSAyMDIwLTAxLTIxIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IERlYXRocyBwZXIgRGF5IikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGxpbmVzKHNlcSgyLCBkYXkuY291bnQpIC0gMC40NSArIDAuMDggKiBpLCBkaWZmKGNvdW50cmllcy5kZWF0aHNbW2ldXSksIHR5cGUgPSAiaCIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gMSwgbHcgPSA0KQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IDEsIGx3ID0gNCwgdGl0bGUgPSAiQ291bnRyeSIsIG5jb2wgPSA0LCBjZXggPSAwLjkpCmBgYAoKIyBDb21wYXJpc29uIG9mIE51bWJlciBvZiBSZWNvdmVyZWQgQ2FzZXMgaW4gV2VzdGVybiBFdXJvcGUKCldBUk5JTkc6IFRoZSBmaWd1cmVzIHNlZW0gdG8gYmUgd3Jvbmcgb24gTWFyY2ggMjMsIDIwMjAuCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KeHJhbmdlIDwtIGMoNDAsIGRheS5jb3VudCkKbWF4LnkgPC0gMApmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgbWF4LnkgPC0gbWF4KGMobWF4LnksIGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSksIG5hLnJtID0gVFJVRSkKfQp4cmFuZ2UgPC0gYyg1MCwgZGF5LmNvdW50KQp5cmFuZ2UgPC0gYygwLCBtYXgueSkKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIlJlY292ZXJlZCBDYXNlcyIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSBKYW51YXJ5IDIxLCAyMDIwIiwgeWxhYiA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgZCA8LSBucm93KGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSkKICBsaW5lcyhzZXEoMSwgZCksIGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSwgdHlwZSA9ICJiIiwgY29sID0gY29sW2ldLCBsdHkgPSBsdHlbaV0sIHBjaCA9IHBjaFtpXSwgbHcgPSAxKQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IGx0eSwgcGNoID0gcGNoLCB0aXRsZSA9ICJDb3VudHJ5IikKCm1heC55IDwtIDAKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIG1heC55IDwtIG1heChjKG1heC55LCBkaWZmKHRhaWwoY291bnRyaWVzLnJlY292ZXJlZFtbaV1dKSkpLCBuYS5ybSA9IFRSVUUpCn0KeHJhbmdlIDwtIGMoZGF5LmNvdW50LTEwLCBkYXkuY291bnQpCnlyYW5nZSA8LSBjKDAsIG1heC55ICogMikKcGxvdCh4cmFuZ2UsIHlyYW5nZSwgbWFpbj0gIk5ldyBSZWNvdmVyZWQgQ2FzZXMgcGVyIERheSAobGFzdCAxMCBkYXlzKSIsIHR5cGUgPSAibiIsIHhsYWIgPSAiRGF5cyBTaW5jZSAyMDIwLTAxLTIxIiwgeWxhYiA9ICJOdW1iZXIgb2YgTmV3IFJlY292ZXJlZCBDYXNlcyBwZXIgRGF5IikKZm9yIChpIGluIHNlcSgxLCBjb3VudHJ5LmNvdW50KSkgewogIGxpbmVzKHNlcSgyLCBkYXkuY291bnQpIC0gMC40NSArIDAuMDggKiBpLCBkaWZmKGNvdW50cmllcy5yZWNvdmVyZWRbW2ldXSksIHR5cGUgPSAiaCIsIGNvbCA9IGNvbFtpXSwgbHR5ID0gMSwgbHcgPSA0KQp9CmdyaWQoKQpsZWdlbmQoInRvcGxlZnQiLCBsZWdlbmQgPSBjb3VudHJ5Lm5hbWVzLCBjb2wgPSBjb2wsIGx0eSA9IDEsIGx3ID0gNCwgdGl0bGUgPSAiQ291bnRyeSIsIG5jb2wgPSA0LCBjZXggPSAwLjkpCmBgYAoKIyBDb21wYXJpc29uIG9mIE51bWJlciBvZiBBY3RpdmUgQ2FzZXMgaW4gV2VzdGVybiBFdXJvcGUKCldBUk5JTkc6IFRoZSBmaWd1cmVzIHNlZW0gdG8gYmUgd3Jvbmcgb24gTWFyY2ggMjMsIDIwMjAuCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KeHJhbmdlIDwtIGMoNDAsIGRheS5jb3VudCkKbWF4LnkgPC0gMApmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgeSA8LSBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0gLSAoY291bnRyaWVzLnJlY292ZXJlZFtbaV1dICsgY291bnRyaWVzLmRlYXRoc1tbaV1dKQogIG1heC55IDwtIG1heChjKG1heC55LCB5KSwgbmEucm0gPSBUUlVFKQp9CnlyYW5nZSA8LSBjKDAsIG1heC55KQpwbG90KHhyYW5nZSwgeXJhbmdlLCBtYWluPSAiQWN0aXZlIENhc2VzIiwgdHlwZSA9ICJuIiwgeGxhYiA9ICJEYXlzIFNpbmNlIEphbnVhcnkgMjEsIDIwMjAiLCB5bGFiID0gIk51bWJlciBvZiBDYXNlcyIpCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICB5IDwtIGNvdW50cmllcy5jb25maXJtZWRbW2ldXSAtIChjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0gKyBjb3VudHJpZXMuZGVhdGhzW1tpXV0pCiAgbGluZXMoc2VxKDEsIGQpLCB5LCB0eXBlID0gImIiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IGx0eVtpXSwgcGNoID0gcGNoW2ldLCBsdyA9IDEpCn0KZ3JpZCgpCmxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGNvdW50cnkubmFtZXMsIGNvbCA9IGNvbCwgbHR5ID0gbHR5LCBwY2ggPSBwY2gsIHRpdGxlID0gIkNvdW50cnkiKQoKbWluLnkgPC0gMAptYXgueSA8LSAwCmZvciAoaSBpbiBzZXEoMSwgY291bnRyeS5jb3VudCkpIHsKICB5IDwtIGNvdW50cmllcy5jb25maXJtZWRbW2ldXSAtIChjb3VudHJpZXMucmVjb3ZlcmVkW1tpXV0gKyBjb3VudHJpZXMuZGVhdGhzW1tpXV0pCiAgeSA8LSB0YWlsKHksIDEwKQogIG1heC55IDwtIG1heChjKG1heC55LCBkaWZmKHkpKSwgbmEucm0gPSBUUlVFKQogIG1pbi55IDwtIG1pbihjKG1pbi55LCBkaWZmKHkpKSwgbmEucm0gPSBUUlVFKQp9CnhyYW5nZSA8LSBjKGRheS5jb3VudC0xMCwgZGF5LmNvdW50KQp5cmFuZ2UgPC0gYyhtaW4ueSwgbWF4LnkgKiAyKQpwbG90KHhyYW5nZSwgeXJhbmdlLCBtYWluPSAiTmV3IEFjdGl2ZSBDYXNlcyBwZXIgRGF5IChsYXN0IDEwIGRheXMpIiwgdHlwZSA9ICJuIiwgeGxhYiA9ICJEYXlzIFNpbmNlIDIwMjAtMDEtMjEiLCB5bGFiID0gIk51bWJlciBvZiBOZXcgQWN0aXZlIENhc2VzIHBlciBEYXkiKQpmb3IgKGkgaW4gc2VxKDEsIGNvdW50cnkuY291bnQpKSB7CiAgeSA8LSBjb3VudHJpZXMuY29uZmlybWVkW1tpXV0gLSAoY291bnRyaWVzLnJlY292ZXJlZFtbaV1dICsgY291bnRyaWVzLmRlYXRoc1tbaV1dKQogIGxpbmVzKHNlcSgyLCBkYXkuY291bnQpIC0gMC40NSArIDAuMDggKiBpLCBkaWZmKHkpLCB0eXBlID0gImgiLCBjb2wgPSBjb2xbaV0sIGx0eSA9IDEsIGx3ID0gNCkKfQpncmlkKCkKbGVnZW5kKCJ0b3BsZWZ0IiwgbGVnZW5kID0gY291bnRyeS5uYW1lcywgY29sID0gY29sLCBsdHkgPSAxLCBsdyA9IDQsIHRpdGxlID0gIkNvdW50cnkiLCBuY29sID0gNCwgY2V4ID0gMC45KQpgYGAKCiMgQWJvdXQKCkFsbCB0aGUgZ3JhcGhzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgZGF0YSBwcm92aWRlZCBieSBKb2hucyBIb3BraW5zIENTU0UgKHByb3ZpZGVkIHRvIHRoZSBwdWJsaWMgc3RyaWN0bHkgZm9yIGVkdWNhdGlvbmFsIGFuZCBhY2FkZW1pYyByZXNlYXJjaCBwdXJwb3NlcykuCgpUaGUgc291cmNlIGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIGdyYXBocyBpcyBhdmFpbGFibGUgdW5kZXIgTUlUIExpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHBlLWRvY291cnQvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvY292aWRfMTlfd2VzdGVybl9ldXJvcGUuUm1kLgoKVGhlIGRhdGEgYXJlIHByb3ZpZGVkIGFzICoyMDE5IE5vdmVsIENvcm9uYXZpcnVzIENPVklELTE5ICgyMDE5LW5Db1YpIERhdGEgUmVwb3NpdG9yeSBieSBKb2hucyBIb3BraW5zIENTU0UqIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5KS4KClNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhpbGlwcGUtZG9jb3VydC9DT1ZJRC0xOS9ibG9iL21hc3Rlci9SRUFETUUubWQgZm9yIG1vcmUgZGV0YWlscy4KCiMjIERhdGEgU291cmNlcwoKKiBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIChXSE8pOiBodHRwczovL3d3dy53aG8uaW50LwoqIERYWS5jbi4gUG5ldW1vbmlhLiAyMDIwLiBodHRwOi8vM2cuZHh5LmNuL25ld2g1L3ZpZXcvcG5ldW1vbmlhLgoqIEJOTyBOZXdzOiBodHRwczovL2Jub25ld3MuY29tL2luZGV4LnBocC8yMDIwLzAyL3RoZS1sYXRlc3QtY29yb25hdmlydXMtY2FzZXMvCiogTmF0aW9uYWwgSGVhbHRoIENvbW1pc3Npb24gb2YgdGhlIFBlb3BsZeKAmXMgUmVwdWJsaWMgb2YgQ2hpbmEgKE5IQyk6CiogaHR0cDovL3d3dy5uaGMuZ292LmNuL3hjcy95cXRiL2xpc3RfZ3piZC5zaHRtbAoqIENoaW5hIENEQyAoQ0NEQyk6IGh0dHA6Ly93ZWVrbHkuY2hpbmFjZGMuY24vbmV3cy9UcmFja2luZ3RoZUVwaWRlbWljLmh0bQoqIEhvbmcgS29uZyBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly93d3cuY2hwLmdvdi5oay9lbi9mZWF0dXJlcy8xMDI0NjUuaHRtbAoqIE1hY2F1IEdvdmVybm1lbnQ6IGh0dHBzOi8vd3d3LnNzbS5nb3YubW8vcG9ydGFsLwoqIFRhaXdhbiBDREM6IGh0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9jZGMuZ292LnR3LzIwMTluY292L3RhaXdhbj9hdXRodXNlcj0wCiogVVMgQ0RDOiBodHRwczovL3d3dy5jZGMuZ292L2Nvcm9uYXZpcnVzLzIwMTktbmNvdi9pbmRleC5odG1sCiogR292ZXJubWVudCBvZiBDYW5hZGE6IGh0dHBzOi8vd3d3LmNhbmFkYS5jYS9lbi9wdWJsaWMtaGVhbHRoL3NlcnZpY2VzL2Rpc2Vhc2VzL2Nvcm9uYXZpcnVzLmh0bWwKKiBBdXN0cmFsaWEgR292ZXJubWVudCBEZXBhcnRtZW50IG9mIEhlYWx0aDogaHR0cHM6Ly93d3cuaGVhbHRoLmdvdi5hdS9uZXdzL2Nvcm9uYXZpcnVzLXVwZGF0ZS1hdC1hLWdsYW5jZQoqIEV1cm9wZWFuIENlbnRyZSBmb3IgRGlzZWFzZSBQcmV2ZW50aW9uIGFuZCBDb250cm9sIChFQ0RDKTogaHR0cHM6Ly93d3cuZWNkYy5ldXJvcGEuZXUvZW4vZ2VvZ3JhcGhpY2FsLWRpc3RyaWJ1dGlvbi0yMDE5LW5jb3YtY2FzZXMKKiBNaW5pc3RyeSBvZiBIZWFsdGggU2luZ2Fwb3JlIChNT0gpOiBodHRwczovL3d3dy5tb2guZ292LnNnL2NvdmlkLTE5CiogSXRhbHkgTWluaXN0cnkgb2YgSGVhbHRoOiBodHRwOi8vd3d3LnNhbHV0ZS5nb3YuaXQvbnVvdm9jb3JvbmF2aXJ1cwoKIyMgVGVybXMgb2YgVXNlCgoqIERhdGEgOiBDb3B5cmlnaHQgMjAyMCBKb2hucyBIb3BraW5zIFVuaXZlcnNpdHksIGFsbCByaWdodHMgcmVzZXJ2ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kLgoqIFNvdXJjZSBjb2RlIGZvciBnZW5lcmF0aW5nIGdyYXBoczogQ29weXJpZ2h0IFBoaWxpcHBlIERvY291cnQuIExpY2Vuc2VkIHVuZGVyIE1JVCBMaWNlbnNlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3BoaWxpcHBlLWRvY291cnQvQ09WSUQtMTkvYmxvYi9tYXN0ZXIvY292aWRfMTlfd2VzdGVybl9ldXJvcGUuUm1kLgoqIEdyYXBoaWNzIDogUHVibGljIERvbWFpbgoK